﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LoghogInterface.Properties;
using LoghogInterface.Models;
using System.Xml;
using System.Xml.Linq;

namespace LoghogInterface.Modules
{
    class ParserConfig
    {
        /// <summary>
        /// Настройки с константами и "магическими" числами
        /// </summary>
        Settings _settings;

        /// <summary>
        /// Файл с настройками
        /// </summary>
        private XDocument _configFile;

        public ParserConfig()
        {
            this.Init();
        }

        /// <summary>
        /// Инициализация
        /// </summary>
        public void Init()
        {
            _settings = new Settings();
            _configFile = XDocument.Load(_settings.ConfigFile);
        }

        /// <summary>
        /// Получение настроек рассылки
        /// </summary>
        /// <returns>Модель настроек рассылки</returns>
        public ModelConfigMailing GetMailingSettings()
        {
            var result = (from config in _configFile.Descendants(_settings.MainTagSettings)
                          from mailing in config.Descendants(_settings.SectionMailingTagSettings)
                          select new ModelConfigMailing {
                              Server = mailing.Element(_settings.TagMailingServer).Value,
                              Port = mailing.Element(_settings.TagMailingPort).Value,
                              Email = mailing.Element(_settings.TagMailingEmail).Value,
                              Filters = this.GetMailingFilters()
                          }).First();
            return result;
        }

        /// <summary>
        /// Получение фильтров
        /// </summary>
        /// <returns>Список фильтров</returns>
        private List<string> GetMailingFilters()
        {
            var filters = (from filter in _configFile.Descendants(_settings.TagMailingFilters).Elements()
                           select filter.Value).ToList();
            return filters;
        }

        /// <summary>
        /// Получение параметров базы данных из файла конфигурации
        /// </summary>
        /// <returns>Модель представления параметров базы данных</returns>
        public ModelConfigDatabase GetDatabaseSettings()
        {
            var result = (from config in _configFile.Descendants(_settings.MainTagSettings)
                          from database in config.Descendants(_settings.SectionDatabaseSettings)
                          select new ModelConfigDatabase {
                            Server = database.Element(_settings.TagDatabaseServer).Value,
                            NameDatabase = database.Element(_settings.TagDatabaseName).Value,
                            User = database.Element(_settings.TagDatabaseUser).Value,
                            Password = database.Element(_settings.TagDatabasePassword).Value
                          }).First();
            return result;
        }

        /// <summary>
        /// Установка настрокей email рассылки
        /// </summary>
        /// <param name="mailingData">Структура с данными настроек</param>
        public void SetMailingSettings(ModelConfigMailing mailingData)
        {
            foreach (var mailingElements in _configFile.Root.Elements(_settings.SectionMailingTagSettings))
            {
                mailingElements.Element(_settings.TagMailingServer).Value = mailingData.Server;
                mailingElements.Element(_settings.TagMailingPort).Value = mailingData.Port;
                mailingElements.Element(_settings.TagMailingEmail).Value = mailingData.Email;

                int filterNumber = 0;
                foreach (var filters in _configFile.Root.Elements(_settings.TagMailingFilters))
                {
                    filters.Element(_settings.TagMailingFilter).Value = mailingData.Filters[filterNumber];
                    filterNumber++;
                }
            }
            _configFile.Save(_settings.ConfigFile);
        }

        /// <summary>
        /// Установка настрокей базы данных
        /// </summary>
        /// <param name="modelDatabase">Модель с данными базы данных</param>
        public void SetDatabaseSettings(ModelConfigDatabase modelDatabase)
        {
            foreach (var dbElements in _configFile.Root.Elements(_settings.SectionDatabaseSettings))
            {
                dbElements.Element(_settings.TagDatabaseServer).Value = modelDatabase.Server;
                dbElements.Element(_settings.TagDatabaseName).Value = modelDatabase.NameDatabase;
                dbElements.Element(_settings.TagDatabaseUser).Value = modelDatabase.User;
                dbElements.Element(_settings.TagDatabasePassword).Value = modelDatabase.Password;
            }
            _configFile.Save(_settings.ConfigFile);
        }
    }
}
